#ifndef CPP_INPUT_METHOD_DEFAULT_H
#define CPP_INPUT_METHOD_DEFAULT_H

#include <vector>
#include <widget/View.h>
#include <utils/InputMethodBase.h>

class Activity;
class ViewGroup;
class Timer;

//@brief 默认输入法
//@author cvte
//@description 默认输入法界面
class InputMethodDefault: public InputMethodBase, private View::OnClickListener, private View::OnTouchListener {
   public:
    InputMethodDefault();
    virtual ~InputMethodDefault();
    static InputMethodDefault* getInstance();
    //@method 初始化键盘界面
    void initUi();
    //@method 销毁键盘界面
    void unInitUi();
    //@method 设置输入法类型（中文、英文等），imeType为支持的类型，imeTypeDefault为默认值
    void setImeType(int imeTypeSupport, IME_TYPE imeTypeDefault);
    //@method 切换输入法类型（中文、英文等）
    void switchImeType(IME_TYPE imeType);
    //@method 重复当前按键
    void repeatCurrentKey();

   private:
    static InputMethodDefault* sInstance;
    typedef std::vector<Bitmap*> BitmapVector;
    BitmapVector mBitmapVector;
    bool mIsShift = false; //是否触发shift键
    bool mIsPinYin = false; //是否处于拼音输入状态
    bool mIsNum = false; //是否处于数字输入状态
    char mPinYinInput[128] = {0}; //输入的拼音字母

    typedef std::vector<int> PageStartWordIndexVector;
    PageStartWordIndexVector mStartWordIndexVector; //候选词每页开始的词的索引
    unsigned int mWordPageIndex = 0; //候选词当前页的索引

    long mKeyLongPressTimerTaskId = -1;
    Timer mKeyLongPressTimer; //按键长按定时器
    Timer mKeyRepeatTimer; //按键重复定时器
    KEY* mCurkey = nullptr; //记录当前点击的按钮

    void onClick(View& view);
    void onTouch(View& view, MotionEvent& event);
    //@method 输入一个拼音字母并开始联想，传入'\0'的话会删除一个字母
    void inputPinYin(char c);
    //@method 清空拼音输入，包括拼音字母和联想词
    void clearInputPinYin();
    //@method 清除最后一个输出字符，如果是拼音，会先清除拼音再清除输出的字符
    void deleteAnOnput();
    //@method 更新拼音候选词界面，pageIndex为页索引，pageIndex = 0为第一页
    void updatePinYinWord(unsigned int pageIndex);
};

#endif